package intelligentCustomer.reasoning;

import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * 需求识别步骤
 * 基于问题分析和用户档案识别用户的实际需求
 */
public class NeedsIdentificationStep implements ReasoningStep {
    /** 大语言模型 */
    private final ChatLanguageModel model;
    
    /** 提示模板 */
    private static final PromptTemplate PROMPT_TEMPLATE = PromptTemplate.from(
        "基于以下信息，识别用户的实际需求和期望。\n" +
        "用户查询: {{query}}\n" +
        "问题分析: {{analysis}}\n" +
        "用户偏好: {{preferences}}\n" +
        "价格敏感度: {{priceSensitivity}}\n\n" +
        "请提供详细的需求识别，包括:\n" +
        "1. 核心需求\n" +
        "2. 次要需求\n" +
        "3. 用户期望的结果\n" +
        "4. 可能的决策因素\n\n" +
        "以JSON格式返回结果，包含以上四个字段。"
    );
    
    /**
     * 构造函数
     * 
     * @param model 大语言模型
     */
    public NeedsIdentificationStep(ChatLanguageModel model) {
        this.model = model;
    }
    
    /**
     * 执行需求识别步骤
     * 
     * @param context 推理上下文
     */
    @Override
    public void execute(ReasoningContext context) {
        try {
            // 获取问题分析结果
            String analysis = (String) context.getAttribute("problemAnalysis");
            if (analysis == null) {
                context.setSuccessful(false);
                context.addReasoningStep(getName(), "无法获取问题分析结果");
                return;
            }
            
            // 准备提示参数
            Map<String, Object> variables = new HashMap<>();
            variables.put("query", context.getQuery());
            variables.put("analysis", analysis);
            variables.put("preferences", String.join(", ", context.getUserProfile().getProductPreferences()));
            variables.put("priceSensitivity", context.getUserProfile().getPriceSensitivity());
            
            // 生成提示
            Prompt prompt = PROMPT_TEMPLATE.apply(variables);
            
            // 调用模型进行需求识别
            String needsIdentification = model.generate(prompt.text());
            
            // 将需求识别结果添加到推理链
            context.addReasoningStep(getName(), needsIdentification);
            
            // 将需求识别结果存储到上下文
            context.setAttribute("needsIdentification", needsIdentification);
            
            // 更新置信度
            context.setConfidence(context.getConfidence() * 0.9);
        } catch (Exception e) {
            context.setSuccessful(false);
            context.addReasoningStep(getName(), "需求识别失败: " + e.getMessage());
        }
    }
    
    /**
     * 获取步骤名称
     * 
     * @return 步骤名称
     */
    @Override
    public String getName() {
        return "需求识别";
    }
} 